import { Observable } from './Observable'
import { isArrayLike, isPromise } from '../utils/utils'
/**
 * 根据值类型进行转换Observable并且完成调用
 * @param input any
 */
export function innerFrom(input: any) {
  // 如果本身为一个Observable对象无需转换直接返回
  if (input instanceof Observable) {
    return input
  }
  if (input != null) {
    // 数组转换
    if (isArrayLike(input)) {
      return fromArrayLike(input)
    }
    if (isPromise(input)) {
      return fromPromise(input)
    }
  }
}

/**
 * 接收一个数组,构建返回一个Observable对象，内部循环调用next并且执行complete
 * @param arr Array
 * @returns Observable
 */
export function fromArrayLike(arr: any[]) {
  return new Observable((subscriber) => {
    for (let i = 0; i < arr.length; i++) {
      subscriber.next(arr[i])
    }
    subscriber.complete()
  })
}
/**
 * 接收一个Promise返回一个Observable对象，内部调用Promise的到结果调用next或error最终执行Complete
 * @param p Promise
 * @returns Observable
 */
export function fromPromise(p: Promise<any>) {
  return new Observable((subscriber) => {
    p.then(value => {
      subscriber.next(value)
      subscriber.complete()
    }).catch(err => {
      subscriber.error(err)
      subscriber.complete()
    })
  })
}

